<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2017/10/10
 * Time: 16:14
 */
header("Content-Type: text/html;charset=utf-8");
/**
 * PHP面向对象之旅:深入理解static变量与方法
 * http://www.jb51.net/article/45252.htm
 * static关键字声明一个属性或方法是和类相关的，而不是和类的某个特定的实例相关，因此，这类属性或方法也称为“类属性”或“类方法”。
 * 如果访问控制权限允许，可不必创建该类对象而直接使用类名加两个冒号“::”调用。
 * static关键字可以用来修饰变量、方法。
 * 不经过实例化，就可以直接访问类中static的属性和static的方法。
 * static 的属性和方法，只能访问static的属性和方法，不能类访问非静态的属性和方法。因为静态属性和方法被创建时，可能还没有任何这个类的实例可以被调用。
 * static的属性，在内存中只有一份，为所有的实例共用。
 * 使用self:: 关键字访问当前类的静态成员。
 * 静态属性公用特性
 * 一个类的所有实例，共用类中的静态属性。
 * 也就是说，在内存中即使有多个实例，静态的属性也只有一份。
 * 下面例子中的设置了一个计数器$count属性，设置private 和 static 修饰。这样，外界并不能直接访问$count属性。而程序运行的结果我们也看到多个实例在使用同一个静态的$count 属性。
 */
class user
{
    private static $count = 0; //记录所有用户的登录情况.

    public function __construct()
    {
        self::$count = self::$count + 1;
    }

    public function getCount()
    {
        return self::$count;
    }

    public function __destruct()
    {
        self::$count = self::$count - 1;
    }
}

$user1 = new user();
$user2 = new user();
$user3 = new user();
echo "now here have " . $user1->getCount() . " user";
echo "<br>";
unset($user3);
echo "now here have " . $user1->getCount() . " user";
/**
 * 当一个类中有非静态方法被 self:: 调用时，系统会自动将这个方法转换为静态方法。
 * 下面的代码被执行了，而且有结果。因为Max方法被系统转换为静态方法了。 (不可以的 这样调用是错误的)
 */
// 实现最大值比较的Math类。
//class Math
//{
//    public  function Max($num1, $num2)
//    {
//        return $num1 > $num2 ? $num1 : $num2;
//    }
//
//    public static function Max3($num1, $num2, $num3)
//    {
//        $num1 = self::Max($num1, $num2);
//        $num2 = self::Max($num2, $num3);
//        $num1 = self::Max($num1, $num2);
//        return $num1;
//    }
//}
//
//$a = 99;
//$b = 77;
//$c = 188;
//echo "显示 $a  $b $c  中的最大值是";
//echo "<br>";
//echo Math::Max3($a, $b, $c);
// 实现最大值比较的Math类。
//class Math{
//
//    public static function Max($num1,$num2){
//        return $num1 > $num2 ? $num1 : $num2;
//    }
//    public static function Max3($num1,$num2,$num3){
//        $num1 = Math::Max($num1,$num2);
//        $num2 = Math::Max($num2,$num3);
//        $num1 = Math::Max($num1,$num2);
//        return $num1;
//    }
//}
//$a = 99;
//$b = 77;
//$c = 88;
//echo "显示 $a  $b $c  中的最大值是";
//echo "<br>";
//echo Math::Max3($a,$b,$c);
// 实现最大值比较的Math类。


//错误的例子
class Math{
    public $pi = 3.14;

    public function Max($num1,$num2){
        echo $this->pi;  //这里的调用看来不应该有问题.

        return $num1 > $num2 ? $num1 : $num2;
    }
    public static function Max3($num1,$num2,$num3){
        $num1 = self::Max($num1,$num2);
        $num2 = self::Max($num2,$num3);
        $num1 = self::Max($num1,$num2);
        return $num1;
    }
}
$a = 99;
$b = 77;
$c = 188;
echo "显示 $a  $b $c  中的最大值是";
echo "<br>";
echo Math::Max3($a,$b,$c);
//Strict Standards: Non-static method Math::Max() should not be called statically in D:\phpstudy\WWW\study\static\demo.php on line 106  严格的标准 不能这样用